package org.agile4j.patterns.command.macros;

/**
 * 厨师对象, 做热菜
 * 
 * @author user
 *
 */
public class HotCook implements CookApi, Runnable {

	/**
	 * 厨师姓名
	 */
	private String name;

	/**
	 * 构造方法, 传入厨师姓名
	 * 
	 * @param name
	 *            厨师姓名
	 */
	public HotCook(String name) {
		this.name = name;
	}

	@Override
	public void cook(int tableNum, String name) {
		// 每次做菜的时间是不一样的,用随机数来模拟一下
		int cookTime = (int) (20 * Math.random());
		System.out.println("【" + this.name + "】厨师正在为【" + tableNum + "】号桌做: 【" + name + "】");

		try {
			Thread.sleep(cookTime * 10);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("【" + this.name + "】厨师为【" + tableNum + "】号桌做好了: 【" + name + "】, 共耗时=" + cookTime + "秒.");
	}

	@Override
	public void run() {

		while (true) {
			// 从命令队列里获取命令对象
			Command cmd = CommandQueue.getOneCommand();
			if (cmd != null) {
				// 说明取到命令对象了,这个命令对象还没有设置接收者
				// 因为前面不知道到底哪一个厨师来真正执行这个命令
				// 现在知道了, 就是单枪厨师实力, 设置到命令对象里面
				cmd.setCookApi(this);
				// 然后真正执行这个命令
				cmd.execute();
			}

			// 休息一秒
			try {
				Thread.sleep(1000L);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
